#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include "msg.h"

static int msgid;

//初始化消息队列
void init_msg(int proj_id)
{
	msgid = msgget(ftok(".", proj_id), IPC_CREAT|0644);	
	if(0 > msgid)
	{
		perror("msgget");
		exit(0);
	}
} 

//删除消息队列
void destory_msg(void)
{
	if(0 > msgctl(msgid, IPC_RMID, NULL))
	{
		perror("msgctl");
	}
}

//发送消息
void msg_snd(const Msg* msg)
{
	if(NULL == msg) return;
	if(0 > msgsnd(msgid, msg, sizeof(Msg)-sizeof(msg->type), 0))
	{
		perror("msgsnd");
	}
}

//接受消息
void msg_rcv(Msg* msg, long type)
{
	if(NULL == msg) return;
	if(0 > msgrcv(msgid, msg, sizeof(Msg), type, 0))
	{
		perror("msgrcv");
	}
}

//发送标志
void snd_flag(int type, int num)
{
	Msgs msgs = {type, num};	
	if(0 > msgsnd(msgid, &msgs, sizeof(Msgs)-sizeof(msgs.type), 0))
	{
		perror("msgsnd flag");
	}
}

//接收标志
int rcv_flag(int type)
{
	Msgs msgs = {};	
	if(0 > msgrcv(msgid, &msgs, sizeof(Msgs), type, 0))
	{
		perror("msgrcv flag");
		return -1;
	}
	return msgs.flag;
}
